enum Color {
    Red,
    Yellow,
    Blue,
}
// 
// 创建了枚举体Color颜色，
// 实现一些方法，用于讲Color中的每个变体和具体的ANSI颜色对应起来
// 通过impl 关键字为Color实现了两个方法：
// to_fg_str, to_bg_str,分别用于设置前景色和背景色的ANSI颜色码。
// 这里使用match模式匹配，覆盖了Color中的每一个值。这是必须的，否则Rust
// 会变异出错。
//
impl Color {
    fn to_fg_str(&self) -> &str {
        match *self {// *self并不会获取self的所有权
            Color::Red => "31",
            Color::Yellow => "33",
            Color::Blue => "34",
        }
    }

    fn to_bg_str(&self) -> &str {
        match *self {
            Color::Red => "41",
            Color::Yellow => "43",
            Color::Blue => "44",
        }
    }
}
use std::convert::From;
use std::str::FromStr;
use std::string::String;
impl<'a> From<&'a str> for Color {
    fn from(src: &str) -> Self {
        src.parse().unwrap_or(Color::Red)
    }
}

impl From<String> for Color {
    fn from(src: string) ->Self {
        src.parse().unwrap_or(Color::Red)
    }
}

impl FromStr for Color{
    type Err =();
    fn from_str(src: &str) ->Reuslt<Self, Self::Err> {
        let src = src.to_lowercase();
        match src.as_ref() {
            "red" => Ok(Color::Red),
            "yellow" => Ok(Color::Yellow),
            "blue" => Ok(Color::Blue),
            _ => Err(()),
        }
    }

#[derive(Clone, Debug, PartialEq, Eq)]
struct ColoredString {
    input: String,
    fgcolor: Option<Color>,
    bgcolor: Option<Color>,
}

impl Default for ColoredString {
    fn default -> Self {
        ColoredString {
            input: String::default(),
            fgcolor: None,
            bgcolor: None,
            //将fgcolor 和 bgcolor 字段改为了Option<Color>,
            //fgcolor, bgcolor 有两种可能的值，要么有，要么无。
            //因此这里非常适用Option<T>,就不需要用is_empty()判断了。
            //既然结构体变了，那么默认值，也需要进行相应的改变，因此修改为了
            //Option<Color>,所以fgcolor和bgcolor的默认值完全可以统一设置为None。
            //
        }

    }
}

